\subsection{Aritm'etica Finita}
\label{sect:impl}

Para hacer los c'alculos de las series de Taylor se utiliz'o una aritm'etica
finita de precisi'on arbitraria, aunque limitada. Para esto se cuenta con una
clase \emph{FPNumber}, que implementa un subconjunto de los operadores 
b'asicos de n'umeros reales sobrecargados para realizar las operaciones
necesarias.

Una primera aproximaci'on a esta clase sugiri'o la posibilidad de implementar
la aritm'etica de punto flotante con d'igitos de precisi'on arbitraria sin
cota m'axima.
Luego de considerar esta posbilidad se concluy'o que implementar esto 
acarrear'ia problemas que no hacen al objetivo del trabajo, complicar'ian 
la depuraci'on y no aportar'ian mayor profundidad al an'alisis emp'irico del
comportamiento num'erico de la serie de Taylor.

En vista de esto, se tom'o la decisi'on de basar la implementaci'on de 
FPNumber en encapsular el tipo de dato \emph{double}, agregando adem'as
un entero de 8 bits que determina la precisi'on con la que se
est'a trabajando. De esta forma, todas las cuentas se hacen utilizando
\emph{double} y luego se truncan a la precisi'on deseada, oscureciendo la 
cola de bits de m'as en la mantisa.

Esto limita el desarrollo ya que solo es posible trabajar con aritm'etica de
hasta 52 bits de precisi'on en la mantisa. Sin embargo, a los fines de lo
estudiado esto se consider'o suficiente.

\subsection{M'etodos Num'ericos Utilizados}

Como se menciona en la introducci'on, lo que se desea es evaluar una funci'on
dada mediante la evaluaci'on de uno de dos polinomios de Taylor y luego
la inversi'on o no del resultado. Para esto se calcul'o el polinomio de Taylor 
para $e^{-x}$ y $e^{x}$ alrededor del 0. Los polinomios de Taylor para estas 
funciones son los siguientes:

Para $e^{-x}$:

\[
P_{n}(x) = \sum{ (-1)^{k} \frac{x^{k}}{k!}  }
\]

Para $e^{x}$:

\[
P_{n}(x) = \sum{ \frac{x^{k}}{k!}  }
\]

Un desarrollo m'as exhaustivo de c'omo obtener estos polinomios se encuentra
en el Anexo~\ref{sect:demos}. En lo que sigue del trabajo se nombrar'a por
\emph{m'etodos} a las dos formas mencionadas de calcular $e^{-a}$.

Una vez obtenidos los polinomios de Taylor fue importante pensar en la forma 
de evaluarlos, ya que al trabajar con precisi'on finita esto puede influir 
fuertemente en el error. En vista de esto, se consideraron tres alternativas,
que ser'an llamadas \emph{modos} de aqu'i en m'as:
\begin{enumerate}
\item Sumar los monomios en orden creciente del exponente
\item Sumar los monomios en orden decreciente del exponente
\item Utilizar la suma anidada
\end{enumerate}

Esto genera seis algoritmos de aproximaci'on del resultado, uno por cada 
combinaci'on m'etodo/modo. Las diferencias entre estos distintos m'etodos y
su relaci'on con los valores de $a$ y la precisi'on con la que se trabaja es
lo que se estudiar'a emp'iricamente en las pr'oximas secciones.

\subsection{Setting General de la Experimentaci'on}

Antes de entrar en el desarrollo de los experimentos realizados es importante 
describir el objetivo general de los mismos y las herramientas utilizadas para
desarrollarlos. Uno de los objetivos de este trabajo es analizar los errores 
obtenidos en las operaciones num'ericas. Para esto es necesario tener una 
expresi'on exacta del valor que se est'a intentando aproximar.

Se podr'ian calcular \emph{a mano}, algunos valores de la funci'on estudiada 
(para $a=0$ por ejemplo), pero calcularlos para n'umeros que resulten 
interesantes y sean valiosos para el an'alisis no es posible, ya 
que los resultados no son representables en forma finita para su comparaci'on
\footnote{Se entiende aqu'i como representables el serlo en forma de 
expresi'on num'erica y no aritm'etica.}.

Dado esto, es necesaria una forma alternativa de calcular estos
valores. El problema es que toda alternativa viable incluye el uso de
aritm'etica finita (y por lo tanto acarrea un error) y hace a la
experimentaci'on inexacta. Ante la falta de una aproximaci'on ideal, se 
intent'o minimizar el error dado por la herramienta del c'alculo ``exacto''
de la funci'on y del error, para lo cual se analizaron dos alternativas:

\begin{enumerate}
\item Utilizar la herramienta desarrollada con la precisi'on m'axima
 (52 bits para la mantisa) y un polinomio con suficiente cantidad de
 t'erminos.
\item Utilizar una herramienta externa.
\end{enumerate}

La primer opci'on no es muy buena, ya que hay que considerar el error 
introducido por utilizar el polinomio de Taylor de forma finita en lugar
de la serie infinita. Por otro lado, utilizar el mismo m'etodo que se est'a
testeando para obtener el benchmark contra el cual se contrastan los 
resultados introduce un sesgo que puede comprometer la correctitud del 
estudio.

Una alternativa para implementar la segunda opci'on considerada es calcular 
el valor \emph{exacto} utilizando la funci'on \texttt{exp} disponible en C++,
que calcula la funci'on matem'atica $\exp$ directamente en la FPU. Resulta 
razonable suponer que dicho valor es lo m'as confiable 
posible dentro de lo que la aritm'etica finita permite, ya que la 
implementaci'on de la estimaci'on fue desarrollada por los ingenieros de AMD,
arquitectos del procesador sobre la cual se realizaron los experimentos, que
conocen seguramente mejor que nadie los secretos de la FPU.

Se desarrollaron experimentos n'umericos persiguiendo el objetivo de los 
experimentos presentados en el enunciado el TP:
\begin{enumerate}
\item Calcular el error relativo de cada m'etodo en funci'on de la 
	cantidad de iteraciones (t'erminos) de la serie de Taylor.
\item Calcular el error relativo de cada m'etodo en funci'on de la cantidad 
	\textit{p} de d'igitos binarios utilizados en la mantisa para implementar 
	los c'alculos num'ericos.
\end{enumerate}

Para realizar este an'alisis se realizaron experimentos con distintos 
valores de $a$. Los valores utilizados fueron: $0.01$, $0.1$, $0.5$, 
$1$, $10$, $20$. La elecci'on de los valores responde a la necesidad
de cubrir una gama de 'ordenes de magnitud. N'umeros
a'un mayores no se utilizaron porque el error del polinomio de Taylor
tan lejos del centro utilizado (i.e., 0) oculta el error de la precisi'on
finita y el m'etodo de evaluaci'on, que es lo que se intenta estudiar.

Se utilizaron tambi'en distintas precisiones: $5, 10, 15, 20$. Notar que se 
eligieron distribuidas uniformemente para cubrir el rango estudiado. 
Se decidi'o estudiar 'unicamente precisiones bajas de modo
de asegurar que el n'umero usado como resultado exacto tuviera un error 
despreciable en comparaci'on. 

Finalmente se combinaron los valores de $a$ mencionados con las distintas 
precisiones para obtener pares (valor, precisi'on). Cada par genera un 
gr'afico que muestra con 6 curvas, una para cada combinacion m'etodo/modo,
el progreso del error relativo del c'alculo en funci'on de la cantidad de
t'erminos considerados del polinomio.

Este es el detalle de cada algoritmo (combinaci'on entre un m'etodo y un
modo) con su referencia en los gr'aficos presentados en la siguiente secci'on:
\begin{itemize}
\item Polinomio de Taylor para $e^{x}$ y suma en en orden inverso 
	(\emph{Backward 0})
\item Polinomio de Taylor para $e^{x}$ y suma en orden (\emph{Forward 0})
\item Polinomio de Taylor para $e^{x}$ y suma anidada (\emph{Horn 0})
\item Polinomio de Taylor para $e^{-x}$ y suma en orden inverso 
	(\emph{Backward 1})
\item Polinomio de Taylor para $e^{-x}$ y suma en orden (\emph{Forward 1})
\item Polinomio de Taylor para $e^{-x}$ y suma anidada (\emph{Horn 1})
\end{itemize}

De esta manera fue posible analizar las distintas formas de calcular $e^{-x}$
para un valor y precisi'on dados. Luego, para poder observar la evoluci'on 
cuando var'ia la precisi'on y/o el $a$ utilizado se colocaron los 24
gr'aficos obtenidos en una matriz de $4 \times 6$ donde hacia abajo 
crece la precisi'on y hacia la derecha crece $a$. Dicha matriz se puede 
observar junto a la interpretaci'on de los resultados en la pr'oxima secci'on.
Debido a las magnitudes representadas, se utilizaron gr'aficos en escala 
logar'itmica que permiten observar los resultados con mayor precisi'on.
